package com.huan.ai.tools;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.ai.tool.execution.ToolCallResultConverter;
import org.springframework.ai.util.json.JsonParser;
import org.springframework.stereotype.Component;

import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;

/**
 * 提供给 ai 使用的工具
 *
 * @author huan.fu
 * @date 2025/6/21 - 11:24
 */
@Component
public class AiTool {

    private static final Logger log = LoggerFactory.getLogger(AiTool.class);

    @Tool(
            name = "get_current_day", // 定义工具的名称，默认为方法的名称
            description = "获取当前是哪一天,返回的格式为 2020-12-12 01:12:12", // 工具的描述
            returnDirect = false // false 表示将工具调用的结果返回给模型， true表示将工具调用的结果直接输出
    )
    public String getCurrentDay() {
        log.info("工具调用： 获取当前是哪一天");
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }

    @Tool(
            name = "calc_add",
            description = "计算2个数的和",
            returnDirect = true, // true表示将工具输出的结果直接输出，不返回给模型
            resultConverter = CustomToolCallResultConverter.class // 对工具输出的结果进行转换
    )
    public BigDecimal add(
            @ToolParam(required = true, description = "加数") BigDecimal num1,
            @ToolParam(required = true, description = "被加数") BigDecimal num2
    ) {
        log.info("开始计算2个数的和，输入的数据是 {}, {}", num1, num2);
        return num1.add(num2);
    }

    public static class CustomToolCallResultConverter implements ToolCallResultConverter {
        @Override
        public String convert(Object result, Type returnType) {
            // 将结果包装成json进行返回
            Map<String, Object> objMap = Map.of("type", returnType.getTypeName(), "result", result);
            return JsonParser.toJson(objMap);
        }
    }
}
